window: Sanitize size hint computation
authorBenjamin Otte <otte@redhat.com>
Sat, 14 Dec 2013 00:15:06 +0000 (01:15 +0100)
committerBenjamin Otte <otte@redhat.com>
Sat, 14 Dec 2013 00:18:23 +0000 (01:18 +0100)
We don't want the maximum size to be smaller than the minimum size. Not
just because it's wrong but also because when this happens the rest of
GTK gets mighty confused and infloops resizing to min-size and
max-size in turns causing a flickering window. Well, at least if you
run X without a window manager. Or your window manager hasn't finished
starting up.

Private RHEL bug finding this issue:
https://bugzilla.redhat.com/show_bug.cgi?id=1035409

gtk/gtkwindow.c

index 92b8f7e92c8f559747ed9c088b9c81ceb19e657f..5c6d0182124d608fbb331d03bd4c62eb76d0cacb 100644 (file)
@@ -9177,22 +9177,21 @@ gtk_window_compute_hints (GtkWindow   *window,
   
   if (*new_flags & GDK_HINT_MAX_SIZE)
     {
-      if (new_geometry->max_width < 0)
-       new_geometry->max_width = requisition.width;
-      else
+      if (new_geometry->max_width >= 0)
        new_geometry->max_width += extra_width;
+      new_geometry->max_width = MAX (new_geometry->max_width, new_geometry->min_width);
 
-      if (new_geometry->max_height < 0)
-       new_geometry->max_height = requisition.height;
-      else
+      if (new_geometry->max_height >= 0)
        new_geometry->max_height += extra_height;
+
+      new_geometry->max_height = MAX (new_geometry->max_height, new_geometry->min_height);
     }
   else if (!priv->resizable)
     {
       *new_flags |= GDK_HINT_MAX_SIZE;
       
-      new_geometry->max_width = requisition.width;
-      new_geometry->max_height = requisition.height;
+      new_geometry->max_width = new_geometry->min_width;
+      new_geometry->max_height = new_geometry->min_height;
     }
 
   *new_flags |= GDK_HINT_WIN_GRAVITY;